﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class AcoesLegaisImagemProcesso
    {
        #region Variaveis Membro
        private int _idImagemProcesso;
        private AcoesLegaisHistoricoProcesso _historicoProcesso;
        private string _path;
        private string _descricao;
        public GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdImagemProcesso
        {
            get { return _idImagemProcesso; }
            set { _idImagemProcesso = value; }
        }

        public AcoesLegaisHistoricoProcesso HistoricoProcesso
        {
            get { return _historicoProcesso; }
            set { _historicoProcesso = value; }
        }

        public string Descricao
        {
            get { return _descricao; }
            set { _descricao = value; }
        }
        
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        #endregion

        #region Construtores
        public AcoesLegaisImagemProcesso()
        {
            _context = new GENTEEntities();
        }

        public AcoesLegaisImagemProcesso(int _idimagem, bool _carregaDados, bool _carregaHistorico)
        {
            _context = new GENTEEntities();
            if (!_carregaDados)
                this._idImagemProcesso = _idimagem;
            else
                Carregar(_idimagem, _carregaHistorico);
        }
        #endregion

        #region Métodos Privados
        private void Carregar(int _idimagem, bool _carregaHistorico)
        {
            try
            {
                var consulta = from imagem in _context.tab_acoes_legais_imagem_processo
                               where imagem.id_imagem_processo == _idimagem
                               select new
                               {
                                   imagem.id_imagem_processo,
                                   imagem.tab_acoes_legais_historico_processo.id_historico_processo,
                                   imagem.descricao,
                                   imagem.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idImagemProcesso = list.id_imagem_processo;
                    this._historicoProcesso = new AcoesLegaisHistoricoProcesso(list.id_historico_processo, _carregaHistorico, false, false, false, false);
                    this._descricao = list.descricao;
                    this._path = list.path;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private int RetornaIdImagemHistorico()
        {
            try
            {
                int _valorRetorno = 0;

                var consulta = (from imagem in _context.tab_acoes_legais_imagem_processo
                                orderby imagem.id_imagem_processo descending
                                select new
                                {
                                    imagem.id_imagem_processo
                                }).Take(1);

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    _valorRetorno = list.id_imagem_processo;
                }

                return _valorRetorno;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void AtualizarPath(string path)
        {
            try
            {
                tab_acoes_legais_imagem_processo tabImagem = (from imagem in _context.tab_acoes_legais_imagem_processo
                                                              where imagem.id_imagem_processo == this._idImagemProcesso
                                                              select imagem).First();

                tabImagem.path = path;
                _context.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos Públicos
        public AcoesLegaisImagemProcesso SelectImagem(int _idhistorico)
        {
            try
            {
                AcoesLegaisImagemProcesso resultImagem = new AcoesLegaisImagemProcesso();

                var consulta = from imagem in _context.tab_acoes_legais_imagem_processo
                               where imagem.tab_acoes_legais_historico_processo.id_historico_processo == _idhistorico
                               select new
                               {
                                   imagem.id_imagem_processo,
                                   imagem.descricao,
                                   imagem.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    resultImagem.IdImagemProcesso = list.id_imagem_processo;
                    resultImagem.Descricao = list.descricao;
                    resultImagem.Path = list.path;
                }

                return resultImagem;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Salvar()
        {
            try
            {
                if (this._idImagemProcesso == 0)
                {
                    tab_acoes_legais_imagem_processo tabImagem = new tab_acoes_legais_imagem_processo();
                    tabImagem.tab_acoes_legais_historico_processoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_acoes_legais_historico_processo", "id_historico_processo", this._historicoProcesso.IdHistoricoProcesso);
                    tabImagem.descricao = this._descricao;
                    tabImagem.path = "";

                    _context.AddTotab_acoes_legais_imagem_processo(tabImagem);
                    _context.SaveChanges();

                    this._idImagemProcesso = RetornaIdImagemHistorico();

                    string nomearquivo = "";
                    TipoDocumento tipodocto = new TipoDocumento();
                    nomearquivo = tipodocto.ObterNomeDocumento(this._historicoProcesso.Processo.Organizacao.IdOrganizacao, TipoDocumento.TipoDocto.Acoes_Judiciais, this._idImagemProcesso.ToString());

                    AtualizarPath(this._path + nomearquivo);
                    this._path = this._path + nomearquivo;
                }
                else
                {

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Excluir(int _idprocesso)
        {
            try
            {
                var consulta = (from imagem in _context.tab_acoes_legais_imagem_processo
                                join historico in _context.tab_acoes_legais_historico_processo on imagem.tab_acoes_legais_historico_processo.id_historico_processo equals historico.id_historico_processo
                                join reclamantehistorico in _context.tab_acoes_reclamante_processo_historico_processo on historico.id_historico_processo equals reclamantehistorico.tab_acoes_legais_historico_processo.id_historico_processo
                                join reclamante in _context.tab_acoes_legais_reclamante on reclamantehistorico.tab_acoes_legais_reclamante.id_reclamante_processo equals reclamante.id_reclamante_processo
                                join processo in _context.tab_acoes_legais_processo on reclamante.tab_acoes_legais_processo.id_processo equals processo.id_processo
                                where processo.id_processo == _idprocesso
                                select imagem);

                var listConsulta = consulta.ToList();

                string caminhodoc = "";
                foreach (var list in listConsulta)
                {
                    caminhodoc = list.path;
                    _context.DeleteObject(list);
                    _context.SaveChanges();

                    if ((caminhodoc != "") && (System.IO.File.Exists(caminhodoc)))
                        System.IO.File.Delete(caminhodoc);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

    }
}
